home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CLASSSRC.PAK / DATEIO.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  184 lines

  1. //----------------------------------------------------------------------------
  2. // Borland Class Library
  3. // Copyright (c) 1993, 1997 by Borland International, All Rights Reserved
  4. //
  5. //$Revision:   5.7  $
  6. //
  7. // TDate class IO and conversion implementation
  8. //----------------------------------------------------------------------------
  9. #include <classlib/pch.h>
  10. #include <classlib/date.h>
  11. #include <services/cstring.h>
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #include <strstrea.h>
  15. #include <tchar.h>
  16.  
  17. //
  18. //
  19. //
  20. TDate::HowToPrint TDate::PrintOption = TDate::Normal;
  21.  
  22. //
  23. //
  24. //
  25. string TDate::AsString() const
  26. {
  27.     _TCHAR buf[80];
  28.     ostrstream strtemp(buf, sizeof(buf));
  29.     strtemp << (*this) << ends;
  30.     string temp(buf);
  31.     return temp;
  32. }
  33.  
  34. //
  35. //
  36. //
  37. TDate::HowToPrint TDate::SetPrintOption( HowToPrint h )
  38. {
  39.     HowToPrint oldoption = PrintOption;
  40.     PrintOption = h;
  41.     return oldoption;
  42. }
  43.  
  44. //
  45. // Skip any characters except alphanumeric characters
  46. //
  47. static void _BIDSNEARFUNC SkipDelim( istream _BIDSFAR & strm )
  48. {
  49.     _TCHAR c;
  50.     if( !strm.good() )
  51.         return;
  52.  
  53.     do  {
  54.         strm >> c;
  55.         } while (strm.good() && !_istalnum(c)) ;
  56.  
  57.     if (strm.good())
  58.         strm.putback(c);
  59. }
  60.  
  61. //
  62. // Parse the name of a month from input stream.
  63. //
  64. static const _TCHAR* _BIDSNEARFUNC ParseMonth( istream _BIDSFAR & s )
  65. {
  66.     static _TCHAR month[12];
  67.     register _TCHAR* p = month;
  68.     _TCHAR c;
  69.     SkipDelim(s);
  70.     s.get(c);
  71.     while (s.good() && _istalpha(c) && (p != &month[10]))
  72.         {
  73.         *p++ = c;
  74.         s.get(c);
  75.         }
  76.     if( s.good() )
  77.         s.putback(c);
  78.     *p = '\0';
  79.     return month;
  80. }
  81.  
  82. //
  83. //  Parse a date from the specified input stream.
  84. //    The date must be in one of the following forms:
  85. //                dd-mmm-yy, mm/dd/yy, or mmm dd,yy
  86. //        e.g.: 10-MAR-86,  3/10/86, or March 10, 1986.
  87. //  Any non-alphanumeric character may be used as a delimiter.
  88. //
  89. void TDate::ParseFrom( istream _BIDSFAR & s )
  90. {
  91.     unsigned d,m,y;
  92.     Julnum = 0;                 // Assume failure
  93.  
  94.     if (s.good())
  95.         {
  96.         SkipDelim(s);
  97.         s >> m;                 // try to parse day or month number
  98.         SkipDelim(s);
  99.         if (s.eof())
  100.             return;
  101.         if( s.fail() )          // parse <monthName><day><year>
  102.             {
  103.             s.clear();
  104.             m = IndexOfMonth(ParseMonth(s)); // parse month name
  105.             SkipDelim(s);
  106.             s >> d;                 // parse day
  107.             }
  108.         else                        // try to parse day number
  109.             {
  110.             s >> d;
  111.             if (s.eof()) return;
  112.             if (s.fail())           // parse <day><monthName><year>
  113.                 {
  114.                 d = m;
  115.                 s.clear();
  116.                 m = IndexOfMonth(ParseMonth(s)); // parse month name
  117.                 }
  118.             }
  119.         SkipDelim(s);
  120.         s >> y;
  121.         }
  122.     Julnum = s.good() ? Jday(m, d, y) : 0;
  123.     if(Julnum==0)
  124.         s.clear(ios::badbit);
  125. }
  126.  
  127. #if defined(BI_NAMESPACE)
  128. namespace ClassLib {
  129. #endif
  130.  
  131. //
  132. //
  133. //
  134. ostream _BIDSFAR & _BIDSFUNC operator << ( ostream _BIDSFAR & s, const TDate _BIDSFAR & d )
  135. {
  136.     _TCHAR buf[80];
  137.  
  138.     // we use an ostrstream to format into buf so that
  139.     // we don't affect the ostream's width setting.
  140.     //
  141.     ostrstream out( buf, sizeof(buf) );
  142.  
  143.     switch ( TDate::PrintOption )
  144.         {
  145.         case TDate::Normal:
  146.             out << d.NameOfMonth() << " "
  147.                 << d.DayOfMonth()  << ", "
  148.                 << d.Year() << ends;
  149.             break;
  150.         case TDate::Terse:
  151.             _stprintf(buf,"%2u-%.3s-%.2u",
  152.                     d.DayOfMonth(),
  153.                     d.NameOfMonth(),
  154.                     d.Year() % 100);
  155.             break;
  156.         case TDate::Numbers:
  157.             out << d.Month() << "/"
  158.                 << d.DayOfMonth() << "/"
  159.                 << (d.Year() % 100) << ends;
  160.             break;
  161.         case TDate::EuropeanNumbers:
  162.             out << d.DayOfMonth()   << "/"
  163.                 << d.Month() <<"/"
  164.                 << (d.Year() % 100) << ends;
  165.             break;
  166.         case TDate::European:
  167.             out << d.DayOfMonth() << " "
  168.                 << d.NameOfMonth() << " "
  169.                 << d.Year() << ends;
  170.             break;
  171.         };
  172.  
  173.     // now we write out the formatted buffer, and the ostream's
  174.     // width setting will control the actual width of the field.
  175.     //
  176.     s << buf;
  177.     return s;
  178. }
  179.  
  180. #if defined(BI_NAMESPACE)
  181. }     // namespace ClassLib
  182. #endif
  183.  
  184.